#pragma once

#include "RungeKutta.h"

/**
 * @file ODESolver.h
 * @author xingyifan
 * @date 2022-07-29 00:18
 * 
 * @description: 一般 ODE 的求解算法
 */

class ODESolver
{
public:
    // Runge-Kutta 方法计算 N 步递推的结果，返回计算时间
    Real solve(FuncXt f, TimeGrid &G, RungeKutta *Z)
    {
        // 计算步数
        int N = G.size();

        // 指针位置
        Gtimer U = G.begin();

        // 开始计时
        clock_t start = clock();

        // 循环计算每一步，N 个节点，移动 N-1 次
        for (int i = 1; i < N; i++)
        {
            U = Z->shift(f, U);
        }

        // 结束计时
        Real t = Real(clock() - start) / CLOCKS_PER_SEC;

        return t;
    }
};